package client;

import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.LinkedList;

import javax.swing.ImageIcon;
import javax.swing.JButton;


import metier.modele.Client;
import metier.modele.Figure;
import metier.outils.*;


/**
 * 
 * @author Quentin, Vincent, Charlie
 *
 */
public class Createur extends JButton implements Tools {

	private static final long serialVersionUID = 1L;
	
	private Class<?> classe;
	private Client client;
	private JCanvas jCanvas;
	private MouseEvent premierClic;
	private Figure figure;
	private Gestionnaire_Client gc;

	/**
	 * Constructeur
	 * @param client
	 * @param gc
	 * @param c
	 * @param panDessin
	 * @param nom
	 * @param icone
	 */
	public Createur(Client client, Gestionnaire_Client gc, String classe,
			JCanvas panDessin, String nom, ImageIcon icone) {
		super(icone);
		setToolTipText(nom);
		addActionListener(gc);
		addKeyListener(gc);

		this.client = client;
		try {
			this.classe = Class.forName(classe);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		this.jCanvas = panDessin;
		this.gc = gc;
	}


	/**
	 * Début d'un clic
	 */
	public void debutClic(MouseEvent e) {
		if (!classe.getName().equalsIgnoreCase("metier.outils.Tools_Delete")
				&& !classe.getName().equalsIgnoreCase("metier.outils.Tools_Edit")) {
			try {
				figure = (Figure) classe.newInstance();
				premierClic = e;
				figure.setCouleurs(jCanvas.getCurrentFg(), jCanvas.getCurrentBg());
				figure.setDonnees(premierClic.getX(), premierClic.getY(), premierClic.getX(), premierClic.getY());
				// Qui dessine
				figure.setOwner(client.getUser());
				// Id (emplacement dans la liste)
				figure.setId(jCanvas.getList().size());
				// On met le status sur 'AJOUT'
				figure.setStatus(Figure.AJOUT);
				// On l'ajoute temporairement à la liste (pour le repaint)
				jCanvas.getList().add(figure);
				jCanvas.repaint();

			} catch (Exception ex) {
				System.out.println("Exception dans la nouvelle instanciation : "+ ex);
			}
		}
	}

	/**
	 * Pendant le clic (drag)
	 */
	public void pendantClic(MouseEvent e) {
		if (!classe.getName().equalsIgnoreCase("metier.outils.Tools_Delete")) {
			int x = e.getX();
			int y = e.getY();
			
			if (gc.isDrawSquare() == true)
			{
				if (classe.getName().equalsIgnoreCase("metier.outils.Tools_Trait"))
				{
					int dx = x - premierClic.getX();
					int dy = y - premierClic.getY();
					if (Math.abs(dx) > 2 * Math.abs(dy))
						y = premierClic.getY();
					else if (Math.abs(dy) > 2* Math.abs(dx))
						x = premierClic.getX();
					else
					{
						x = premierClic.getX() + dx;
						if (dy > 0 && dx < 0)
							y = premierClic.getY() - dx;
						else if (dy > 0 && dx > 0)
							y = premierClic.getY() + dx;
						else if (dy < 0 && dx > 0)
							y = premierClic.getY() - dx;
						else // dy < 0 && dx < 0
							y = premierClic.getY() + dx;
					}
				}
				else if (classe.getName().equalsIgnoreCase("metier.outils.Tools_Rect")
						|| classe.getName().equalsIgnoreCase("metier.outils.Tools_Ellipse"))
				{
					int dx = x - premierClic.getX();
					int dy = y - premierClic.getY();
					x = premierClic.getX() + dx;
					if (dy > 0 && dx < 0)
						y = premierClic.getY() - dx;
					else if (dy > 0 && dx > 0)
						y = premierClic.getY() + dx;
					else if (dy < 0 && dx > 0)
						y = premierClic.getY() - dx;
					else // dy < 0 && dx < 0
						y = premierClic.getY() + dx;
				}
			}
			
			figure.setDonnees(premierClic.getX(), premierClic.getY(), x, y);
			jCanvas.repaint();
		}
	}

	/**
	 * Relachement du clic
	 */
	public void finClic(MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		if (classe.getName().equalsIgnoreCase("metier.outils.Tools_Delete")) // Outils gomme
		{
			jCanvas.setAllFigureStatus(Figure.AJOUT);
			LinkedList<Figure> llf = jCanvas.getList();
			if (llf.size() > 0) {
				int i;
				for (i = llf.size()-1; i >= 0; i--) { // On part de la figure la plus 'au-dessus', la dernière ajoutée
					if (llf.get(i).pointInFigure(new Point(x, y)) == true) {
						break;
					}
				}
				System.out.println("Figure à supprimer: " + i);
				if (i < llf.size() && i != -1)
				{
					jCanvas.getList().get(i).setStatus(Figure.SUPPRESSION);
				}
			}
			jCanvas.repaint();
		}
		else // Les autres
		{
			
			if (gc.isDrawSquare() == true)
			{
				if (classe.getName().equalsIgnoreCase("metier.outils.Tools_Trait"))
				{
					int dx = x - premierClic.getX();
					int dy = y - premierClic.getY();
					if (Math.abs(dx) > 2 * Math.abs(dy))
						y = premierClic.getY();
					else if (Math.abs(dy) > 2* Math.abs(dx))
						x = premierClic.getX();
					else
					{
						x = premierClic.getX() + dx;
						if (dy > 0 && dx < 0)
							y = premierClic.getY() - dx;
						else if (dy > 0 && dx > 0)
							y = premierClic.getY() + dx;
						else if (dy < 0 && dx > 0)
							y = premierClic.getY() - dx;
						else // dy < 0 && dx < 0
							y = premierClic.getY() + dx;
					}
				}
				else if (classe.getName().equalsIgnoreCase("metier.outils.Tools_Rect")
						|| classe.getName().equalsIgnoreCase("metier.outils.Tools_Ellipse"))
				{
					int dx = x - premierClic.getX();
					int dy = y - premierClic.getY();
					x = premierClic.getX() + dx;
					if (dy > 0 && dx < 0)
						y = premierClic.getY() - dx;
					else if (dy > 0 && dx > 0)
						y = premierClic.getY() + dx;
					else if (dy < 0 && dx > 0)
						y = premierClic.getY() - dx;
					else // dy < 0 && dx < 0
						y = premierClic.getY() + dx;
				}
			}
			figure.setDonnees(premierClic.getX(), premierClic.getY(),x, y);
			jCanvas.repaint();
			if (client.isOnline()) // On est online ? On envoie !
			{
				jCanvas.getList().remove(figure);
				client.getCnx().Envoie(figure);
			}
		}

	}

	public void simpleClic(MouseEvent e) {
	}

}